--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / backend / recovery / crash_recovery.py
Displaying Raw • Download
meshchatx/src/backend/recovery/crash_recovery.py 4baf577b4e8a2a90e12e807024d0a8e469956c9b (4baf577b) Text, 36.96 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Crash recovery and adaptive diagnostics for MeshChatX.
Uses entropy, KL-divergence, and Bayesian weight learning. Crash history is
persisted; priors refine over time (conjugate Beta-Binomial model).
"""
Tff7b72import T7ee787contextlib
Tff7b72import T7ee787errno
Tff7b72import T7ee787json
Tff7b72import T7ee787os
Tff7b72import T7ee787platform
Tff7b72import T7ee787re
Tff7b72import T7ee787shutil
Tff7b72import T7ee787sqlite3
Tff7b72import T7ee787sys
Tff7b72import T7ee787time
Tff7b72import T7ee787traceback
Tff7b72import T7ee787psutil
Tff7b72import T7ee787RNS
Te6edf3_DEFAULT_PRIORS Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffDB_SYNC_FAILURETa5d6ff"Tb4b4b4: T79c0ff0.05Tb4b4b4,
Ta5d6ff"Ta5d6ffDB_CORRUPTIONTa5d6ff"Tb4b4b4: T79c0ff0.05Tb4b4b4,
Ta5d6ff"Ta5d6ffASYNC_RACETa5d6ff"Tb4b4b4: T79c0ff0.10Tb4b4b4,
Ta5d6ff"Ta5d6ffOOMTa5d6ff"Tb4b4b4: T79c0ff0.02Tb4b4b4,
Ta5d6ff"Ta5d6ffCONFIG_MISSINGTa5d6ff"Tb4b4b4: T79c0ff0.01Tb4b4b4,
Ta5d6ff"Ta5d6ffFILESYSTEM_PERMISSION_DENIEDTa5d6ff"Tb4b4b4: T79c0ff0.05Tb4b4b4,
Ta5d6ff"Ta5d6ffRNS_IDENTITY_FAILURETa5d6ff"Tb4b4b4: T79c0ff0.05Tb4b4b4,
Ta5d6ff"Ta5d6ffLXMF_STORAGE_FAILURETa5d6ff"Tb4b4b4: T79c0ff0.05Tb4b4b4,
Ta5d6ff"Ta5d6ffINTERFACE_OFFLINETa5d6ff"Tb4b4b4: T79c0ff0.05Tb4b4b4,
Ta5d6ff"Ta5d6ffUNSUPPORTED_PYTHONTa5d6ff"Tb4b4b4: T79c0ff0.05Tb4b4b4,
Ta5d6ff"Ta5d6ffLEGACY_SYSTEM_LIMITATIONTa5d6ff"Tb4b4b4: T79c0ff0.05Tb4b4b4,
Tb4b4b4}
Tff7b72class T56d364CrashRecoveryTb4b4b4:
T8b949e"""Intercept crashes and report diagnostics plus environment state.
Learns from crash history to refine root-cause probabilities over time.
"""
Tff7b72def Tff7b72__init__Tb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3storage_dirTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3database_pathTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3public_dirTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3reticulum_config_dirTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3databaseTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3log_handlerTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstorage_dir Tff7b72= Te6edf3storage_dir
Tff7b72selfTff7b72.Td2a8ffdatabase_path Tff7b72= Te6edf3database_path
Tff7b72selfTff7b72.Td2a8ffpublic_dir Tff7b72= Te6edf3public_dir
Tff7b72selfTff7b72.Td2a8ffreticulum_config_dir Tff7b72= Te6edf3reticulum_config_dir
Tff7b72selfTff7b72.Td2a8ffdatabase Tff7b72= Te6edf3database
Tff7b72selfTff7b72.Td2a8fflog_handler Tff7b72= Te6edf3log_handler
Tff7b72selfTff7b72.Td2a8ffenabled Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_learned_priors Tff7b72= Tff7b72None
T8b949e# Check environment variable to allow disabling the recovery system
Te6edf3env_val Tff7b72= Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_NO_CRASH_RECOVERYTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3env_val Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6fftrueTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffyesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffonTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffenabled Tff7b72= Tff7b72False
Tff7b72def Td2a8ffinstallTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Installs the crash recovery exception hook into the system."""
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffenabledTb4b4b4:
Tff7b72return
Te6edf3sysTff7b72.Td2a8ffexcepthook Tff7b72= Tff7b72selfTff7b72.Td2a8ffhandle_exception
Tff7b72def Td2a8ffdisableTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Disables the crash recovery system manually."""
Tff7b72selfTff7b72.Td2a8ffenabled Tff7b72= Tff7b72False
Tff7b72def Td2a8ffupdate_pathsTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3storage_dirTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3database_pathTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3public_dirTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3reticulum_config_dirTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
T8b949e"""Updates the internal paths used for system diagnosis."""
Tff7b72if Te6edf3storage_dirTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstorage_dir Tff7b72= Te6edf3storage_dir
Tff7b72if Te6edf3database_pathTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdatabase_path Tff7b72= Te6edf3database_path
Tff7b72if Te6edf3public_dirTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpublic_dir Tff7b72= Te6edf3public_dir
Tff7b72if Te6edf3reticulum_config_dirTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreticulum_config_dir Tff7b72= Te6edf3reticulum_config_dir
Tff7b72def Td2a8ffset_databaseTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3databaseTb4b4b4)Tb4b4b4:
T8b949e"""Provide database access for crash persistence and weight learning."""
Tff7b72selfTff7b72.Td2a8ffdatabase Tff7b72= Te6edf3database
Tff7b72selfTff7b72.Td2a8ff_load_learned_priorsTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_load_learned_priorsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Load learned Bayesian priors from the config table."""
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffdatabaseTb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Te6edf3raw Tff7b72= Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffdiagnostic_weightsTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3rawTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_learned_priors Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3rawTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_learned_priors Tff7b72= Tff7b72None
Tff7b72def Td2a8ff_get_priorTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3cause_keyTb4b4b4)Tb4b4b4:
T8b949e"""Return the learned prior for a cause, falling back to the hardcoded default."""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_learned_priors Tff7b72and Te6edf3cause_key Tff7b72in Tff7b72selfTff7b72.Td2a8ff_learned_priorsTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_learned_priorsTb4b4b4[Te6edf3cause_keyTb4b4b4]
Tff7b72return Te6edf3_DEFAULT_PRIORSTff7b72.Td2a8ffgetTb4b4b4(Te6edf3cause_keyTb4b4b4, T79c0ff0.05Tb4b4b4)
Tff7b72def Td2a8ff_persist_crashTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3error_typeTb4b4b4,
Te6edf3error_msgTb4b4b4,
Te6edf3causesTb4b4b4,
Te6edf3symptomsTb4b4b4,
Te6edf3entropyTb4b4b4,
Te6edf3divergenceTb4b4b4,
Tb4b4b4)Tb4b4b4:
T8b949e"""Store crash event in crash_history for future learning."""
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffdatabaseTb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Te6edf3top_cause Tff7b72= Te6edf3causesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4] Tff7b72if Te6edf3causes Tff7b72else Ta5d6ff"Ta5d6ffUnknownTa5d6ff"
Te6edf3top_prob Tff7b72= Te6edf3causesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72if Te6edf3causes Tff7b72else T79c0ff0
Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcrash_historyTff7b72.Td2a8ffinsert_crashTb4b4b4(
Te6edf3timestampTff7b72=Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3error_typeTff7b72=Te6edf3error_typeTb4b4b4,
Te6edf3error_messageTff7b72=Te6edf3error_msgTb4b4b4,
Te6edf3diagnosed_causeTff7b72=Te6edf3top_causeTb4b4b4,
Te6edf3symptomsTff7b72=Te6edf3symptomsTb4b4b4,
Te6edf3probabilityTff7b72=Te6edf3top_probTb4b4b4,
Te6edf3entropyTff7b72=Te6edf3entropyTb4b4b4,
Te6edf3divergenceTff7b72=Te6edf3divergenceTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcrash_historyTff7b72.Td2a8ffcleanup_oldTb4b4b4(Te6edf3max_entriesTff7b72=T79c0ff200Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72def Td2a8ff_update_learned_weightsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Bayesian weight update using Beta-Binomial conjugate model."""
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffdatabaseTb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Te6edf3freq_rows Tff7b72= Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcrash_historyTff7b72.Td2a8ffget_cause_frequenciesTb4b4b4(Te6edf3limitTff7b72=T79c0ff50Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3freq_rowsTb4b4b4:
Tff7b72return
Te6edf3total Tff7b72= Tffa657sumTb4b4b4(Te6edf3rTb4b4b4[Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3r Tff7b72in Te6edf3freq_rowsTb4b4b4)
Tff7b72if Te6edf3total Tff7b72< T79c0ff3Tb4b4b4:
Tff7b72return
Te6edf3cause_counts Tff7b72= Tb4b4b4{Te6edf3rTb4b4b4[Ta5d6ff"Ta5d6ffdiagnosed_causeTa5d6ff"Tb4b4b4]Tb4b4b4: Te6edf3rTb4b4b4[Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3r Tff7b72in Te6edf3freq_rowsTb4b4b4}
Te6edf3weights Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3key Tff7b72in Te6edf3_DEFAULT_PRIORSTb4b4b4:
Te6edf3desc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_cause_key_to_descriptionTb4b4b4(Te6edf3keyTb4b4b4)
Te6edf3count Tff7b72= Te6edf3cause_countsTff7b72.Td2a8ffgetTb4b4b4(Te6edf3descTb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3alpha Tff7b72= T79c0ff1.0 Tff7b72+ Te6edf3count
Te6edf3beta Tff7b72= T79c0ff1.0 Tff7b72+ Tb4b4b4(Te6edf3total Tff7b72- Te6edf3countTb4b4b4)
Te6edf3posterior Tff7b72= Te6edf3alpha Tff7b72/ Tb4b4b4(Te6edf3alpha Tff7b72+ Te6edf3betaTb4b4b4)
Te6edf3weightsTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Tffa657maxTb4b4b4(T79c0ff0.01Tb4b4b4, Tffa657minTb4b4b4(T79c0ff0.99Tb4b4b4, Tffa657roundTb4b4b4(Te6edf3posteriorTb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffconfigTff7b72.Td2a8ffsetTb4b4b4(Ta5d6ff"Ta5d6ffdiagnostic_weightsTa5d6ff"Tb4b4b4, Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3weightsTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_learned_priors Tff7b72= Te6edf3weights
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tf0883e@staticmethod
Tff7b72def Td2a8ff_cause_key_to_descriptionTb4b4b4(Te6edf3keyTb4b4b4)Tb4b4b4:
T8b949e"""Map internal cause keys to their human-readable descriptions."""
Te6edf3mapping Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffDB_SYNC_FAILURETa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffIn-Memory Database Sync FailureTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffDB_CORRUPTIONTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSQLite Database CorruptionTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffASYNC_RACETa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAsynchronous Initialization Race ConditionTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffOOMTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSystem Resource Exhaustion (OOM)Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffCONFIG_MISSINGTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMissing Reticulum ConfigurationTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffFILESYSTEM_PERMISSION_DENIEDTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffFilesystem Permission DeniedTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffRNS_IDENTITY_FAILURETa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffReticulum Identity Load FailureTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffLXMF_STORAGE_FAILURETa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffLXMF Router Storage FailureTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffINTERFACE_OFFLINETa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffReticulum Interface Initialization FailureTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffUNSUPPORTED_PYTHONTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffUnsupported Python EnvironmentTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffLEGACY_SYSTEM_LIMITATIONTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffLegacy System Resource LimitationTa5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72return Te6edf3mappingTff7b72.Td2a8ffgetTb4b4b4(Te6edf3keyTb4b4b4, Te6edf3keyTb4b4b4)
Tff7b72def Td2a8ffhandle_exceptionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3exc_typeTb4b4b4, Te6edf3exc_valueTb4b4b4, Te6edf3exc_tracebackTb4b4b4)Tb4b4b4:
T8b949e"""Intercepts unhandled exceptions to provide a detailed diagnosis report."""
T8b949e# Let keyboard interrupts pass through normally
Tff7b72if Tffa657issubclassTb4b4b4(Te6edf3exc_typeTb4b4b4, Tf85149KeyboardInterruptTb4b4b4)Tb4b4b4:
Te6edf3sysTff7b72.Td2a8ff__excepthook__Tb4b4b4(Te6edf3exc_typeTb4b4b4, Te6edf3exc_valueTb4b4b4, Te6edf3exc_tracebackTb4b4b4)
Tff7b72return
T8b949e# Use stderr for everything to ensure correct ordering in logs and console
Te6edf3out Tff7b72= Te6edf3sysTff7b72.Td2a8ffstderr
T8b949e# Print visual separator
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff" Tff7b72+ Ta5d6ff"Ta5d6ff=Ta5d6ff" Tff7b72* T79c0ff70 Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff!!! APPLICATION CRASH DETECTED !!!Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff=Ta5d6ff" Tff7b72* T79c0ff70 Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
T8b949e# Core error details
Te6edf3error_msg Tff7b72= Tffa657strTb4b4b4(Te6edf3exc_valueTb4b4b4)
Te6edf3error_type Tff7b72= Te6edf3exc_typeTff7b72.Td2a8ff__name__
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ffError Summary:Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Type: Tffd700{Te6edf3error_typeTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Message: Tffd700{Te6edf3error_msgTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
T8b949e# Perform logical diagnosis
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ffSystem Environment Diagnosis:Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3diagnosis_results Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72tryTb4b4b4:
Te6edf3diagnosis_results Tff7b72= Tff7b72selfTff7b72.Td2a8ffrun_diagnosisTb4b4b4(Te6edf3fileTff7b72=Te6edf3outTb4b4b4, Te6edf3crash_exceptionTff7b72=Te6edf3exc_valueTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff [ERROR] Failed to complete diagnosis: Tffd700{Te6edf3eTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ffRoot Cause Analysis:Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3causes Tff7b72= Tff7b72selfTff7b72.Td2a8ff_analyze_causeTb4b4b4(Te6edf3exc_typeTb4b4b4, Te6edf3exc_valueTb4b4b4, Te6edf3diagnosis_resultsTb4b4b4)
Te6edf3entropyTb4b4b4, Te6edf3divergence Tff7b72= Tff7b72selfTff7b72.Td2a8ff_calculate_system_entropyTb4b4b4(Te6edf3diagnosis_resultsTb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff [System Entropy: Tffd700{Te6edf3entropyTffd700:Ta5d6ff.4fTffd700}Ta5d6ff bits]Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff [KL-Divergence: Tffd700{Te6edf3divergenceTffd700:Ta5d6ff.4fTffd700}Ta5d6ff bits]Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fflog_handlerTb4b4b4:
Te6edf3log_ent Tff7b72= Tff7b72selfTff7b72.Td2a8fflog_handlerTff7b72.Td2a8ffcurrent_log_entropy
Te6edf3err_rate Tff7b72= Tff7b72selfTff7b72.Td2a8fflog_handlerTff7b72.Td2a8ffcurrent_error_rate
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff [Log Entropy (60s): Tffd700{Te6edf3log_entTffd700:Ta5d6ff.4fTffd700}Ta5d6ff bits]Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff [Error Rate (60s): Tffd700{Te6edf3err_rateTffd700:Ta5d6ff.2%Tffd700}Ta5d6ff]Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_learned_priorsTb4b4b4:
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff [Bayesian Priors: Learned from crash history]Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3cause Tff7b72in Te6edf3causesTb4b4b4:
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ff - [Tffd700{Te6edf3causeTb4b4b4[Ta5d6ff'Ta5d6ffprobabilityTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff% Probability] Tffd700{Te6edf3causeTb4b4b4[Ta5d6ff'Ta5d6ffdescriptionTa5d6ff'Tb4b4b4]Tffd700}Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Reasoning: Tffd700{Te6edf3causeTb4b4b4[Ta5d6ff'Ta5d6ffreasoningTa5d6ff'Tb4b4b4]Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ffTechnical Traceback:Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3tracebackTff7b72.Td2a8ffprint_exceptionTb4b4b4(Te6edf3exc_typeTb4b4b4, Te6edf3exc_valueTb4b4b4, Te6edf3exc_tracebackTb4b4b4, Te6edf3fileTff7b72=Te6edf3outTb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff" Tff7b72+ Ta5d6ff"Ta5d6ff=Ta5d6ff" Tff7b72* T79c0ff70 Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffRecovery Suggestions:Tffea00\nTa5d6ff"Tb4b4b4)
T8b949e# Dynamic suggestions based on causes
Tff7b72if Te6edf3causesTb4b4b4:
Tff7b72for Te6edf3iTb4b4b4, Te6edf3cause Tff7b72in Tffa657enumerateTb4b4b4(Te6edf3causesTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3suggestion Tff7b72in Te6edf3causeTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffsuggestionsTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4:
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3iTffd700}Ta5d6ff. Tffd700{Te6edf3suggestionTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# Fallback standard suggestions
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff 1. Review the Ta5d6ff'Ta5d6ffSystem Environment DiagnosisTa5d6ff'Ta5d6ff section above.Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff 2. Verify that all dependencies are installed (poetry install or pip install -r requirements.txt).Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff 3. If database corruption is suspected, try starting with --auto-recover.Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff *. If the issue persists, report it to Ivan over another LXMF client: 7cc8d66b4f6a0e0e49d34af7f6077b5aTffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff=Ta5d6ff" Tff7b72* T79c0ff70 Tff7b72+ Ta5d6ff"Tffea00\nTffea00\nTa5d6ff"Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
T8b949e# Persist crash and update weights (best-effort, never raise)
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_persist_crashTb4b4b4(Te6edf3error_typeTb4b4b4, Te6edf3error_msgTb4b4b4, Te6edf3causesTb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4, Te6edf3entropyTb4b4b4, Te6edf3divergenceTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_update_learned_weightsTb4b4b4(Tb4b4b4)
T8b949e# Exit with error code
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72def Td2a8ff_analyze_causeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3exc_typeTb4b4b4, Te6edf3exc_valueTb4b4b4, Te6edf3diagnosisTb4b4b4)Tb4b4b4:
T8b949e"""Rank likely root causes using heuristics and Bayesian priors."""
Te6edf3causes Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3error_msg Tff7b72= Tffa657strTb4b4b4(Te6edf3exc_valueTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Te6edf3error_type Tff7b72= Te6edf3exc_typeTff7b72.Td2a8ff__name__Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
T8b949e# Define potential root causes with prior probabilities (learned or default)
Te6edf3potential_causes Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffDB_SYNC_FAILURETa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_get_priorTb4b4b4(Ta5d6ff"Ta5d6ffDB_SYNC_FAILURETa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffIn-Memory Database Sync FailureTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffreasoningTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffA background thread attempted to access an in-memory database that was not initialized in its local context.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsuggestionsTa5d6ff"Tb4b4b4: Tb4b4b4[
Ta5d6ff"Ta5d6ffEnsure the application is using a shared connection for :memory: databases.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffUpdate to the latest version of MeshChatX which includes a fix for this.Ta5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffDB_CORRUPTIONTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_get_priorTb4b4b4(Ta5d6ff"Ta5d6ffDB_CORRUPTIONTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSQLite Database CorruptionTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffreasoningTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffThe database file on disk has become physically or logically corrupted.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsuggestionsTa5d6ff"Tb4b4b4: Tb4b4b4[
Ta5d6ff"Ta5d6ffUse --auto-recover to attempt a repair.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffRestore from a recent backup using --restore-db <backup_path>.Ta5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffASYNC_RACETa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_get_priorTb4b4b4(Ta5d6ff"Ta5d6ffASYNC_RACETa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAsynchronous Initialization Race ConditionTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffreasoningTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffA component tried to access the asyncio event loop before it was started.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsuggestionsTa5d6ff"Tb4b4b4: Tb4b4b4[
Ta5d6ff"Ta5d6ffCheck if you are running a supported Python version (3.10+ recommended).Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffVerify that background tasks are correctly deferred until the loop is running.Ta5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffOOMTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_get_priorTb4b4b4(Ta5d6ff"Ta5d6ffOOMTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSystem Resource Exhaustion (OOM)Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffreasoningTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAvailable system memory is extremely low, leading to allocation failures.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsuggestionsTa5d6ff"Tb4b4b4: Tb4b4b4[
Ta5d6ff"Ta5d6ffClose other memory-intensive applications.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffAdd more RAM or swap space to the system.Ta5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffCONFIG_MISSINGTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_get_priorTb4b4b4(Ta5d6ff"Ta5d6ffCONFIG_MISSINGTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMissing Reticulum ConfigurationTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffreasoningTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffThe Reticulum Network Stack (RNS) could not find its configuration file.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsuggestionsTa5d6ff"Tb4b4b4: Tb4b4b4[
Ta5d6ff"Ta5d6ffEnsure ~/.reticulum/config exists or provide a custom path via --reticulum-config-dir.Ta5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffFILESYSTEM_PERMISSION_DENIEDTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_get_priorTb4b4b4(Ta5d6ff"Ta5d6ffFILESYSTEM_PERMISSION_DENIEDTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffFilesystem Permission DeniedTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffreasoningTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffThe process could not create or write a required directory or file (EACCES/EPERM).Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsuggestionsTa5d6ff"Tb4b4b4: Tb4b4b4[
Ta5d6ff"Ta5d6ffFix ownership or permissions on the storage path (or its parent). The process user must be able to create that directory.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffIf using Docker or Podman, mount the volume with UID/GID matching the container user, use docker run --user, or chown the host directory.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffSet MESHCHAT_STORAGE_DIR to a writable location, or point --storage-dir at a directory the runtime user owns.Ta5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffRNS_IDENTITY_FAILURETa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_get_priorTb4b4b4(Ta5d6ff"Ta5d6ffRNS_IDENTITY_FAILURETa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffReticulum Identity Load FailureTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffreasoningTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffThe Reticulum identity file is missing, corrupt, or unreadable.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsuggestionsTa5d6ff"Tb4b4b4: Tb4b4b4[
Ta5d6ff"Ta5d6ffCheck permissions on the identity file.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffIf the file is corrupt, you may need to recreate it (this will change your address).Ta5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffLXMF_STORAGE_FAILURETa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_get_priorTb4b4b4(Ta5d6ff"Ta5d6ffLXMF_STORAGE_FAILURETa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffLXMF Router Storage FailureTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffreasoningTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffThe LXMF router could not access its message storage directory.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsuggestionsTa5d6ff"Tb4b4b4: Tb4b4b4[
Ta5d6ff"Ta5d6ffVerify that the storage directory is writable.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffCheck for filesystem-level locks or full disks.Ta5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffINTERFACE_OFFLINETa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_get_priorTb4b4b4(Ta5d6ff"Ta5d6ffINTERFACE_OFFLINETa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffReticulum Interface Initialization FailureTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffreasoningTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffNo active communication interfaces could be established.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsuggestionsTa5d6ff"Tb4b4b4: Tb4b4b4[
Ta5d6ff"Ta5d6ffCheck your Reticulum config for interface errors.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffVerify hardware connections (USB, Serial, Ethernet) for LoRa/TNC devices.Ta5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffUNSUPPORTED_PYTHONTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_get_priorTb4b4b4(Ta5d6ff"Ta5d6ffUNSUPPORTED_PYTHONTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffUnsupported Python EnvironmentTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffreasoningTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffThe application is running on an outdated or incompatible Python version.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsuggestionsTa5d6ff"Tb4b4b4: Tb4b4b4[
Ta5d6ff"Ta5d6ffUpgrade to Python 3.10 or higher (3.11/3.12+ recommended).Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffCheck if you are running inside a legacy virtualenv.Ta5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffLEGACY_SYSTEM_LIMITATIONTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_get_priorTb4b4b4(Ta5d6ff"Ta5d6ffLEGACY_SYSTEM_LIMITATIONTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffLegacy System Resource LimitationTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffreasoningTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffThe host system lacks modern kernel features or resource allocation capabilities required for high-performance mesh networking.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsuggestionsTa5d6ff"Tb4b4b4: Tb4b4b4[
Ta5d6ff"Ta5d6ffIf running on a very old kernel, consider upgrading or using a more modern distribution.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffEnsure Ta5d6ff'Ta5d6ffpsutilTa5d6ff'Ta5d6ff and other system wrappers are correctly installed for your architecture.Ta5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}
T8b949e# Symptom Weights (Likelihoods)
T8b949e# We use a simplified Bayesian update: P(Cause|Symptom) is boosted if symptom is present
Te6edf3py_version Tff7b72= Te6edf3sysTff7b72.Td2a8ffversion_info
Te6edf3symptoms Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffsqlite_in_msgTa5d6ff"Tb4b4b4: Tffa657anyTb4b4b4(Te6edf3x Tff7b72in Te6edf3error_msg Tff7b72for Te6edf3x Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffsqliteTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdatabaseTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72or Ta5d6ff"Ta5d6ffsqliteTa5d6ff" Tff7b72in Te6edf3error_typeTb4b4b4,
Ta5d6ff"Ta5d6ffno_table_configTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffno such table: configTa5d6ff" Tff7b72in Te6edf3error_msgTb4b4b4,
Ta5d6ff"Ta5d6ffin_memory_dbTa5d6ff"Tb4b4b4: Te6edf3diagnosisTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffdb_typeTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffmemoryTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcorrupt_in_msgTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffcorruptTa5d6ff" Tff7b72in Te6edf3error_msg Tff7b72or Ta5d6ff"Ta5d6ffmalformedTa5d6ff" Tff7b72in Te6edf3error_msgTb4b4b4,
Ta5d6ff"Ta5d6ffasync_in_msgTa5d6ff"Tb4b4b4: Tffa657anyTb4b4b4(
Te6edf3x Tff7b72in Te6edf3error_msg Tff7b72for Te6edf3x Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffasyncioTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffevent loopTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffruntimeerrorTa5d6ff"Tb4b4b4]
Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffno_loop_in_msgTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffno current event loopTa5d6ff" Tff7b72in Te6edf3error_msg
Tff7b72or Ta5d6ff"Ta5d6ffno running event loopTa5d6ff" Tff7b72in Te6edf3error_msgTb4b4b4,
Ta5d6ff"Ta5d6fflow_memTa5d6ff"Tb4b4b4: Te6edf3diagnosisTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fflow_memoryTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffrns_config_missingTa5d6ff"Tb4b4b4: Te6edf3diagnosisTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffconfig_missingTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffrns_in_msgTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffreticulumTa5d6ff" Tff7b72in Te6edf3error_msg Tff7b72or Ta5d6ff"Ta5d6ffrnsTa5d6ff" Tff7b72in Te6edf3error_msgTb4b4b4,
Ta5d6ff"Ta5d6fflxmf_in_msgTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflxmfTa5d6ff" Tff7b72in Te6edf3error_msg Tff7b72or Ta5d6ff"Ta5d6fflxmrTa5d6ff" Tff7b72in Te6edf3error_msgTb4b4b4,
Ta5d6ff"Ta5d6ffidentity_in_msgTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffidentityTa5d6ff" Tff7b72in Te6edf3error_msg Tff7b72or Ta5d6ff"Ta5d6ffprivate keyTa5d6ff" Tff7b72in Te6edf3error_msgTb4b4b4,
Ta5d6ff"Ta5d6ffno_interfacesTa5d6ff"Tb4b4b4: Te6edf3diagnosisTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffactive_interfacesTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4) Tff7b72== T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffold_pythonTa5d6ff"Tb4b4b4: Te6edf3py_versionTff7b72.Td2a8ffmajor Tff7b72< T79c0ff3
Tff7b72or Tb4b4b4(Te6edf3py_versionTff7b72.Td2a8ffmajor Tff7b72== T79c0ff3 Tff7b72and Te6edf3py_versionTff7b72.Td2a8ffminor Tff7b72< T79c0ff10Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fflegacy_kernelTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflinuxTa5d6ff" Tff7b72in Te6edf3platformTff7b72.Td2a8ffsystemTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72and Tb4b4b4(
Tb4b4b4(Te6edf3_m Tff7b72:= Te6edf3reTff7b72.Td2a8ffsearchTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff(Ta5d6ff\Ta5d6ffd+Ta5d6ff\Ta5d6ff.Ta5d6ff\Ta5d6ffd+)Ta5d6ff"Tb4b4b4, Te6edf3platformTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4) Tff7b72is Tff7b72not Tff7b72None
Tff7b72and Tffa657floatTb4b4b4(Te6edf3_mTff7b72.Td2a8ffgroupTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tff7b72< T79c0ff4.0
Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffattribute_errorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffattributeerrorTa5d6ff" Tff7b72in Te6edf3error_typeTb4b4b4,
Ta5d6ff"Ta5d6ffpermission_deniedTa5d6ff"Tb4b4b4: Te6edf3diagnosisTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffpermission_deniedTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4,
Tb4b4b4}
T8b949e# Update probabilities based on symptoms (Heuristic Likelihoods)
Tff7b72if Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffold_pythonTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffUNSUPPORTED_PYTHONTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.98
Tff7b72if Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffattribute_errorTa5d6ff"Tb4b4b4] Tff7b72or Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffasync_in_msgTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffUNSUPPORTED_PYTHONTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.99
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffUNSUPPORTED_PYTHONTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffreasoningTa5d6ff"Tb4b4b4] Tff7b72+Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ff Detected missing standard library features common in older Python releases.Ta5d6ff"
Tb4b4b4)
Tff7b72if Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6fflegacy_kernelTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffLEGACY_SYSTEM_LIMITATIONTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.80
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffLEGACY_SYSTEM_LIMITATIONTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffreasoningTa5d6ff"Tb4b4b4] Tff7b72+Tff7b72= Tb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ff (Kernel detected: Tffd700{Te6edf3platformTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"
Tb4b4b4)
Tff7b72if Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffrns_in_msgTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffidentity_in_msgTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffRNS_IDENTITY_FAILURETa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.95
Tff7b72elif Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffno_interfacesTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffINTERFACE_OFFLINETa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.85
Tff7b72if Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6fflxmf_in_msgTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffstorageTa5d6ff" Tff7b72in Te6edf3error_msg Tff7b72or Ta5d6ff"Ta5d6ffdirectoryTa5d6ff" Tff7b72in Te6edf3error_msgTb4b4b4:
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffLXMF_STORAGE_FAILURETa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.90
Tff7b72if Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffsqlite_in_msgTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffno_table_configTa5d6ff"Tb4b4b4] Tff7b72and Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffin_memory_dbTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffDB_SYNC_FAILURETa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.95
Tff7b72elif Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffcorrupt_in_msgTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffDB_CORRUPTIONTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.92
Tff7b72elseTb4b4b4:
T8b949e# Generic DB issue
Tff7b72pass
Tff7b72if Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffasync_in_msgTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffno_loop_in_msgTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffASYNC_RACETa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.88
Tff7b72elseTb4b4b4:
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffASYNC_RACETa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.45
Tff7b72if Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6fflow_memTa5d6ff"Tb4b4b4]Tb4b4b4:
T8b949e# If we have a DB error and low memory, OOM is highly likely as the true cause
Tff7b72if Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffsqlite_in_msgTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffOOMTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.85
Tff7b72elseTb4b4b4:
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffOOMTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.75
Tff7b72if Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffrns_config_missingTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffCONFIG_MISSINGTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.99
Tff7b72if Tb4b4b4(
Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffpermission_deniedTa5d6ff"Tb4b4b4]
Tff7b72or Te6edf3exc_type Tff7b72is Tf85149PermissionError
Tff7b72or Tb4b4b4(
Tffa657isinstanceTb4b4b4(Te6edf3exc_valueTb4b4b4, Tf85149OSErrorTb4b4b4)
Tff7b72and Tffa657getattrTb4b4b4(Te6edf3exc_valueTb4b4b4, Ta5d6ff"Ta5d6fferrnoTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72in Tb4b4b4(Te6edf3errnoTff7b72.Td2a8ffEACCESTb4b4b4, Te6edf3errnoTff7b72.Td2a8ffEPERMTb4b4b4)
Tb4b4b4)
Tb4b4b4)Tb4b4b4:
Te6edf3symptomsTb4b4b4[Ta5d6ff"Ta5d6ffpermission_deniedTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffFILESYSTEM_PERMISSION_DENIEDTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.99
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffCONFIG_MISSINGTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72= Tffa657minTb4b4b4(
Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffCONFIG_MISSINGTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4]Tb4b4b4,
T79c0ff0.02Tb4b4b4,
Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_likely_container_runtimeTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3extra Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffContainer runtime detected: verify volume mounts, user namespace Ta5d6ff"
Ta5d6ff"Ta5d6ff(--user), and host directory ownership.Ta5d6ff"
Tb4b4b4)
Te6edf3suggestions Tff7b72= Te6edf3potential_causesTb4b4b4[Ta5d6ff"Ta5d6ffFILESYSTEM_PERMISSION_DENIEDTa5d6ff"Tb4b4b4]Tb4b4b4[
Ta5d6ff"Ta5d6ffsuggestionsTa5d6ff"
Tb4b4b4]
Tff7b72if Te6edf3extra Tff7b72not Tff7b72in Te6edf3suggestionsTb4b4b4:
Te6edf3suggestionsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3extraTb4b4b4)
T8b949e# Filter and sort by probability
Te6edf3causes Tff7b72= Tb4b4b4[
Tb4b4b4{
Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4: Tffa657intTb4b4b4(Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72* T79c0ff100Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffreasoningTa5d6ff"Tb4b4b4: Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffreasoningTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffsuggestionsTa5d6ff"Tb4b4b4: Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffsuggestionsTa5d6ff"Tb4b4b4]Tb4b4b4,
Tb4b4b4}
Tff7b72for Te6edf3data Tff7b72in Te6edf3potential_causesTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4] Tff7b72> T79c0ff0.3
Tb4b4b4]
Te6edf3causesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3xTb4b4b4: Te6edf3xTb4b4b4[Ta5d6ff"Ta5d6ffprobabilityTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72return Te6edf3causes
Tff7b72def Td2a8ff_calculate_system_entropyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3diagnosisTb4b4b4)Tb4b4b4:
T8b949e"""Return heuristic system entropy and KL-divergence (information gain)."""
Tff7b72import T7ee787math
Tff7b72def Td2a8ffhTb4b4b4(Te6edf3pTb4b4b4)Tb4b4b4:
Te6edf3p Tff7b72= Tffa657minTb4b4b4(T79c0ff0.99Tb4b4b4, Tffa657maxTb4b4b4(T79c0ff0.01Tb4b4b4, Te6edf3pTb4b4b4)Tb4b4b4)
Tff7b72return Tff7b72-Tb4b4b4(Te6edf3p Tff7b72* Te6edf3mathTff7b72.Td2a8fflog2Tb4b4b4(Te6edf3pTb4b4b4) Tff7b72+ Tb4b4b4(T79c0ff1.0 Tff7b72- Te6edf3pTb4b4b4) Tff7b72* Te6edf3mathTff7b72.Td2a8fflog2Tb4b4b4(T79c0ff1.0 Tff7b72- Te6edf3pTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffkl_divTb4b4b4(Te6edf3pTb4b4b4, Te6edf3qTb4b4b4)Tb4b4b4:
T8b949e"""Kullback-Leibler Divergence: D_KL(P || Q) for Bernoulli distributions."""
Te6edf3p Tff7b72= Tffa657minTb4b4b4(T79c0ff0.99Tb4b4b4, Tffa657maxTb4b4b4(T79c0ff0.01Tb4b4b4, Te6edf3pTb4b4b4)Tb4b4b4)
Te6edf3q Tff7b72= Tffa657minTb4b4b4(T79c0ff0.99Tb4b4b4, Tffa657maxTb4b4b4(T79c0ff0.01Tb4b4b4, Te6edf3qTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3p Tff7b72* Te6edf3mathTff7b72.Td2a8fflog2Tb4b4b4(Te6edf3p Tff7b72/ Te6edf3qTb4b4b4) Tff7b72+ Tb4b4b4(T79c0ff1.0 Tff7b72- Te6edf3pTb4b4b4) Tff7b72* Te6edf3mathTff7b72.Td2a8fflog2Tb4b4b4(Tb4b4b4(T79c0ff1.0 Tff7b72- Te6edf3pTb4b4b4) Tff7b72/ Tb4b4b4(T79c0ff1.0 Tff7b72- Te6edf3qTb4b4b4)Tb4b4b4)
T8b949e# Dimensions of uncertainty (Current vs Ideal Setpoint)
T8b949e# Dimensions: [Memory, Config, Database, PythonVersion]
Te6edf3p_vec Tff7b72= Tb4b4b4[T79c0ff0.1Tb4b4b4, T79c0ff0.05Tb4b4b4, T79c0ff0.02Tb4b4b4, T79c0ff0.01Tb4b4b4] T8b949e# Baseline Ideal Probabilities of Failure
Te6edf3q_vec Tff7b72= Tb4b4b4[T79c0ff0.1Tb4b4b4, T79c0ff0.05Tb4b4b4, T79c0ff0.02Tb4b4b4, T79c0ff0.01Tb4b4b4] T8b949e# Observed Probabilities
T8b949e# 1. Memory Stability Dimension
Tff7b72tryTb4b4b4:
Te6edf3avail_mem Tff7b72= Te6edf3diagnosisTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffavailable_mem_mbTa5d6ff"Tb4b4b4, T79c0ff1024Tb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3avail_memTb4b4b4, Tb4b4b4(Tffa657intTb4b4b4, Tffa657floatTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3avail_mem Tff7b72= Tffa657floatTb4b4b4(Te6edf3avail_memTb4b4b4) Tff7b72if Te6edf3avail_mem Tff7b72else T79c0ff1024
Tff7b72if Te6edf3diagnosisTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fflow_memoryTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3q_vecTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0.6
Tff7b72elif Te6edf3avail_mem Tff7b72< T79c0ff500Tb4b4b4:
Te6edf3q_vecTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0.3
Tff7b72except Tb4b4b4(Tf85149ValueErrorTb4b4b4, Tf85149TypeErrorTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3diagnosisTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fflow_memoryTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3q_vecTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0.6
T8b949e# 2. Configuration/RNS Dimension
Tff7b72if Te6edf3diagnosisTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffpermission_deniedTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3q_vecTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= T79c0ff0.25
Tff7b72elif Te6edf3diagnosisTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffconfig_missingTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3q_vecTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= T79c0ff0.8
Tff7b72elif Te6edf3diagnosisTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffconfig_invalidTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3q_vecTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= T79c0ff0.4
T8b949e# 3. Database State Dimension
Tff7b72if Te6edf3diagnosisTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffdb_typeTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffmemoryTa5d6ff"Tb4b4b4:
Te6edf3q_vecTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= T79c0ff0.3
T8b949e# 4. Compatibility Dimension
Te6edf3py_version Tff7b72= Te6edf3sysTff7b72.Td2a8ffversion_info
Tff7b72if Te6edf3py_versionTff7b72.Td2a8ffmajor Tff7b72< T79c0ff3 Tff7b72or Tb4b4b4(Te6edf3py_versionTff7b72.Td2a8ffmajor Tff7b72== T79c0ff3 Tff7b72and Te6edf3py_versionTff7b72.Td2a8ffminor Tff7b72< T79c0ff10Tb4b4b4)Tb4b4b4:
Te6edf3q_vecTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72= T79c0ff0.7
Tff7b72elif Te6edf3py_versionTff7b72.Td2a8ffmajor Tff7b72== T79c0ff3 Tff7b72and Te6edf3py_versionTff7b72.Td2a8ffminor Tff7b72== T79c0ff10Tb4b4b4:
Te6edf3q_vecTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72= T79c0ff0.2
T8b949e# Entropy: Current Disorder
Te6edf3entropy Tff7b72= Tffa657sumTb4b4b4(Te6edf3hTb4b4b4(Te6edf3qTb4b4b4) Tff7b72for Te6edf3q Tff7b72in Te6edf3q_vecTb4b4b4)
T8b949e# Systemic Divergence: How 'surprising' this state is compared to ideal
Te6edf3divergence Tff7b72= Tffa657sumTb4b4b4(Te6edf3kl_divTb4b4b4(Te6edf3qTb4b4b4, Te6edf3pTb4b4b4) Tff7b72for Te6edf3qTb4b4b4, Te6edf3p Tff7b72in Tffa657zipTb4b4b4(Te6edf3q_vecTb4b4b4, Te6edf3p_vecTb4b4b4, Te6edf3strictTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3entropyTb4b4b4, Te6edf3divergence
Tf0883e@staticmethod
Tff7b72def Td2a8ff_likely_container_runtimeTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Ta5d6ff"Ta5d6ff/.dockerenvTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Ta5d6ff"Ta5d6ff/proc/self/cgroupTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Ta5d6ff"Ta5d6ff/proc/self/cgroupTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3cg Tff7b72= Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657anyTb4b4b4(
Te6edf3x Tff7b72in Te6edf3cg
Tff7b72for Te6edf3x Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ffdockerTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcontainerdTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffkubepodsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflibpodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpodmanTa5d6ff"Tb4b4b4)
Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72return Tff7b72False
Tff7b72def Td2a8ff_append_permission_failure_diagnosisTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3excTb4b4b4, Te6edf3fileTb4b4b4, Te6edf3resultsTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3exc Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3excTb4b4b4, Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72elif Tffa657isinstanceTb4b4b4(Te6edf3excTb4b4b4, Tf85149OSErrorTb4b4b4) Tff7b72and Tffa657getattrTb4b4b4(Te6edf3excTb4b4b4, Ta5d6ff"Ta5d6fferrnoTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72in Tb4b4b4(
Te6edf3errnoTff7b72.Td2a8ffEACCESTb4b4b4,
Te6edf3errnoTff7b72.Td2a8ffEPERMTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72elseTb4b4b4:
Tff7b72return
Te6edf3path Tff7b72= Tffa657getattrTb4b4b4(Te6edf3excTb4b4b4, Ta5d6ff"Ta5d6fffilenameTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Tff7b72not Te6edf3pathTb4b4b4:
Tff7b72return
Te6edf3resultsTb4b4b4[Ta5d6ff"Ta5d6ffpermission_deniedTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Te6edf3resultsTb4b4b4[Ta5d6ff"Ta5d6ffpermission_denied_pathTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3path
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff- Filesystem permission failure (from this crash):Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff - Path: Tffd700{Te6edf3pathTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3parent Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3pathTb4b4b4) Tff7b72or Te6edf3path
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff - Parent directory: Tffd700{Te6edf3parentTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3parentTb4b4b4)Tb4b4b4:
Te6edf3writable Tff7b72= Te6edf3osTff7b72.Td2a8ffaccessTb4b4b4(Te6edf3parentTb4b4b4, Te6edf3osTff7b72.Td2a8ffW_OKTb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff - Parent exists: yes; writable by this process: Ta5d6ff"
Ta5d6fffTa5d6ff"Tffd700{Ta5d6ff'Ta5d6ffyesTa5d6ff' Tff7b72if Te6edf3writable Tff7b72else Ta5d6ff'Ta5d6ffNO (cannot create files or subdirectories here)Ta5d6ff'Tffd700}Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3osTff7b72.Td2a8ffstatTb4b4b4(Te6edf3parentTb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ff - Parent mode: Tffd700{Tffa657octTb4b4b4(Te6edf3stTff7b72.Td2a8ffst_modeTb4b4b4)Tffd700}Ta5d6ff uid=Tffd700{Te6edf3stTff7b72.Td2a8ffst_uidTffd700}Ta5d6ff gid=Tffd700{Te6edf3stTff7b72.Td2a8ffst_gidTffd700}Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff - Parent does not exist: creation failed, or an ancestor directory Ta5d6ff"
Ta5d6ff"Ta5d6ffis missing or not writable.Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3cur Tff7b72= Te6edf3parent
Te6edf3steps Tff7b72= T79c0ff0
Tff7b72while Te6edf3cur Tff7b72and Te6edf3steps Tff7b72< T79c0ff64Tb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3curTb4b4b4)Tb4b4b4:
Te6edf3ok Tff7b72= Te6edf3osTff7b72.Td2a8ffaccessTb4b4b4(Te6edf3curTb4b4b4, Te6edf3osTff7b72.Td2a8ffW_OKTb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ff - First existing ancestor: Tffd700{Te6edf3curTffd700}Ta5d6ff; writable: Ta5d6ff"
Ta5d6fffTa5d6ff"Tffd700{Ta5d6ff'Ta5d6ffyesTa5d6ff' Tff7b72if Te6edf3ok Tff7b72else Ta5d6ff'Ta5d6ffNOTa5d6ff'Tffd700}Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3osTff7b72.Td2a8ffstatTb4b4b4(Te6edf3curTb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ff mode=Tffd700{Tffa657octTb4b4b4(Te6edf3stTff7b72.Td2a8ffst_modeTb4b4b4)Tffd700}Ta5d6ff uid=Tffd700{Te6edf3stTff7b72.Td2a8ffst_uidTffd700}Ta5d6ff gid=Tffd700{Te6edf3stTff7b72.Td2a8ffst_gidTffd700}Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72break
Te6edf3nxt Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3curTb4b4b4)
Tff7b72if Te6edf3nxt Tff7b72== Te6edf3curTb4b4b4:
Tff7b72break
Te6edf3cur Tff7b72= Te6edf3nxt
Te6edf3steps Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_likely_container_runtimeTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff [NOTE] Container-style environment: bind mounts must be writable by Ta5d6ff"
Ta5d6ff"Ta5d6ffthe container UID/GID (check docker run --user, volume ownership).Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8ffrun_diagnosisTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4, Te6edf3crash_exceptionTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""Performs a series of OS-agnostic checks on the application's environment."""
Te6edf3results Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6fflow_memoryTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffconfig_missingTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffavailable_mem_mbTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffdb_typeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffpermission_deniedTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Tb4b4b4}
T8b949e# Basic System Info
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ff- OS: Tffd700{Te6edf3platformTff7b72.Td2a8ffsystemTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff Tffd700{Te6edf3platformTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff (Tffd700{Te6edf3platformTff7b72.Td2a8ffmachineTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff)Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff- Python: Tffd700{Te6edf3sysTff7b72.Td2a8ffversionTff7b72.Td2a8ffsplitTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_append_permission_failure_diagnosisTb4b4b4(Te6edf3crash_exceptionTb4b4b4, Te6edf3fileTb4b4b4, Te6edf3resultsTb4b4b4)
T8b949e# Resource Monitoring
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3mem Tff7b72= Te6edf3psutilTff7b72.Td2a8ffvirtual_memoryTb4b4b4(Tb4b4b4)
Te6edf3resultsTb4b4b4[Ta5d6ff"Ta5d6ffavailable_mem_mbTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3memTff7b72.Td2a8ffavailable Tff7b72/ Tb4b4b4(T79c0ff1024Tff7b72*Tff7b72*T79c0ff2Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ff- Memory: Tffd700{Te6edf3memTff7b72.Td2a8ffpercentTffd700}Ta5d6ff% used (Tffd700{Te6edf3resultsTb4b4b4[Ta5d6ff'Ta5d6ffavailable_mem_mbTa5d6ff'Tb4b4b4]Tffd700:Ta5d6ff.1fTffd700}Ta5d6ff MB available)Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3memTff7b72.Td2a8ffpercent Tff7b72> T79c0ff95Tb4b4b4:
Te6edf3resultsTb4b4b4[Ta5d6ff"Ta5d6fflow_memoryTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff [CRITICAL] System memory is dangerously low!Tffea00\nTa5d6ff"Tb4b4b4)
T8b949e# Filesystem Status
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff- Storage Path: Tffd700{Tff7b72selfTff7b72.Td2a8ffstorage_dirTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4)Tb4b4b4:
Te6edf3parent Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTff7b72.Td2a8ffrstripTb4b4b4(Te6edf3osTff7b72.Td2a8ffsepTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3parent Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3parentTb4b4b4)Tb4b4b4:
Te6edf3pw Tff7b72= Te6edf3osTff7b72.Td2a8ffaccessTb4b4b4(Te6edf3parentTb4b4b4, Te6edf3osTff7b72.Td2a8ffW_OKTb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff [ERROR] Storage path does not exist; parent Ta5d6ff"
Ta5d6fffTa5d6ff"Tffd700{Ta5d6ff'Ta5d6ffis writable (mkdir should succeed)Ta5d6ff' Tff7b72if Te6edf3pw Tff7b72else Ta5d6ff'Ta5d6ffis NOT writable (permission issue)Ta5d6ff'Tffd700}Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff [ERROR] Storage path does not exist. Check MESHCHAT_STORAGE_DIR Ta5d6ff"
Ta5d6ff"Ta5d6ffor parent paths.Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffaccessTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4, Te6edf3osTff7b72.Td2a8ffW_OKTb4b4b4)Tb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff [ERROR] Storage path is NOT writable. Check filesystem permissions.Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3usage Tff7b72= Te6edf3shutilTff7b72.Td2a8ffdisk_usageTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4)
Te6edf3free_mb Tff7b72= Te6edf3usageTff7b72.Td2a8fffree Tff7b72/ Tb4b4b4(T79c0ff1024Tff7b72*Tff7b72*T79c0ff2Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff - Disk Space: Tffd700{Te6edf3free_mbTffd700:Ta5d6ff.1fTffd700}Ta5d6ff MB freeTffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3free_mb Tff7b72< T79c0ff50Tb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff [CRITICAL] Disk space is critically low (< 50MB)!Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
T8b949e# Database Integrity
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdatabase_pathTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff- Database: Tffd700{Tff7b72selfTff7b72.Td2a8ffdatabase_pathTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdatabase_path Tff7b72== Ta5d6ff"Ta5d6ff:memory:Ta5d6ff"Tb4b4b4:
Te6edf3resultsTb4b4b4[Ta5d6ff"Ta5d6ffdb_typeTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffmemoryTa5d6ff"
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff - Type: In-MemoryTffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdatabase_pathTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffgetsizeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdatabase_pathTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff [WARNING] Database file exists but is empty (0 bytes).Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
T8b949e# Open in read-only mode for safety during crash handling
Te6edf3conn Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6fffile:Tffd700{Tff7b72selfTff7b72.Td2a8ffdatabase_pathTffd700}Ta5d6ff?mode=roTa5d6ff"Tb4b4b4,
Te6edf3uriTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Te6edf3cursor Tff7b72= Te6edf3connTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3cursorTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffPRAGMA integrity_checkTa5d6ff"Tb4b4b4)
Te6edf3res Tff7b72= Te6edf3cursorTff7b72.Td2a8fffetchoneTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3res Tff7b72!= Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ff [ERROR] Database corruption detected: Tffd700{Te6edf3resTffd700}Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff - Integrity: OKTffea00\nTa5d6ff"Tb4b4b4)
Te6edf3connTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Te6edf3sqlite3Tff7b72.Td2a8ffDatabaseError Tff7b72as Te6edf3eTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ff [ERROR] Database is unreadable or not a SQLite file: Tffd700{Te6edf3eTffd700}Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff [ERROR] Database check failed: Tffd700{Te6edf3eTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff - Database: File not yet createdTffea00\nTa5d6ff"Tb4b4b4)
T8b949e# Frontend Assets
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpublic_dirTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff- Frontend Assets: Tffd700{Tff7b72selfTff7b72.Td2a8ffpublic_dirTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpublic_dirTb4b4b4)Tb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff [ERROR] Frontend directory is missing. Web interface will fail to load.Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3index_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpublic_dirTb4b4b4, Ta5d6ff"Ta5d6ffindex.htmlTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3index_pathTb4b4b4)Tb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff [ERROR] index.html not found in frontend directory!Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff - Frontend Status: Assets verifiedTffea00\nTa5d6ff"Tb4b4b4)
T8b949e# Reticulum Status
Te6edf3resultsTff7b72.Td2a8ffupdateTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrun_reticulum_diagnosisTb4b4b4(Te6edf3fileTff7b72=Te6edf3fileTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3results
Tff7b72def Td2a8ffrun_reticulum_diagnosisTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)Tb4b4b4:
T8b949e"""Diagnoses the Reticulum Network Stack environment."""
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff- Reticulum Network Stack:Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3results Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffconfig_missingTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffactive_interfacesTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4}
Te6edf3config_dir Tff7b72= Tff7b72selfTff7b72.Td2a8ffreticulum_config_dir Tff7b72or Tffa657getattrTb4b4b4(
Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4,
Ta5d6ff"Ta5d6ffconfigpathTa5d6ff"Tb4b4b4,
Tff7b72NoneTb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3config_dir Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3config_dir Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3display_cfg Tff7b72= Te6edf3config_dir Tff7b72if Tffa657strTb4b4b4(Te6edf3config_dirTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4) Tff7b72else Ta5d6ff"Ta5d6ff(not resolved yet)Ta5d6ff"
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff - Config Directory: Tffd700{Te6edf3display_cfgTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657strTb4b4b4(Te6edf3config_dirTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff [INFO] Config path not set until Reticulum initializes; Ta5d6ff"
Ta5d6ff"Ta5d6ffskipping on-disk config checks.Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3resultsTb4b4b4[Ta5d6ff"Ta5d6ffconfig_not_resolvedTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Tff7b72elif Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3config_dirTb4b4b4)Tb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff [ERROR] Reticulum config directory does not exist.Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3resultsTb4b4b4[Ta5d6ff"Ta5d6ffconfig_missingTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Tff7b72return Te6edf3results
Tff7b72if Tffa657strTb4b4b4(Te6edf3config_dirTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3config_file Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3config_dirTb4b4b4, Ta5d6ff"Ta5d6ffconfigTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3config_fileTb4b4b4)Tb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff [ERROR] Reticulum config file is missing.Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3resultsTb4b4b4[Ta5d6ff"Ta5d6ffconfig_missingTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
T8b949e# Basic config validation
Tff7b72with Tffa657openTb4b4b4(Te6edf3config_fileTb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3content Tff7b72= Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ff[reticulum]Ta5d6ff" Tff7b72not Tff7b72in Te6edf3contentTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff [ERROR] Reticulum config file is invalid (missing [reticulum] section).Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3resultsTb4b4b4[Ta5d6ff"Ta5d6ffconfig_invalidTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff - Config File: OKTffea00\nTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff [ERROR] Could not read Reticulum config: Tffd700{Te6edf3eTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3resultsTb4b4b4[Ta5d6ff"Ta5d6ffconfig_unreadableTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
T8b949e# Extract recent RNS log entries if possible
T8b949e# Check common log file locations
Te6edf3log_paths Tff7b72= Tb4b4b4[
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3config_dirTb4b4b4, Ta5d6ff"Ta5d6fflogfileTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3config_dirTb4b4b4, Ta5d6ff"Ta5d6ffrnsd.logTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ff/var/log/rnsd.logTa5d6ff"Tb4b4b4,
Tb4b4b4]
Te6edf3found_logs Tff7b72= Tff7b72False
Tff7b72for Te6edf3logfile Tff7b72in Te6edf3log_pathsTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3logfileTb4b4b4)Tb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff - Recent Log Entries (Tffd700{Te6edf3logfileTffd700}Ta5d6ff):Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3logfileTb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3lines Tff7b72= Te6edf3fTff7b72.Td2a8ffreadlinesTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3linesTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff (Log file is empty)Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72for Te6edf3line Tff7b72in Te6edf3linesTb4b4b4[Tff7b72-T79c0ff15Tb4b4b4:Tb4b4b4]Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffERRORTa5d6ff" Tff7b72in Te6edf3line Tff7b72or Ta5d6ff"Ta5d6ffCRITICALTa5d6ff" Tff7b72in Te6edf3lineTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff > [ALERT] Tffd700{Te6edf3lineTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff > Tffd700{Te6edf3lineTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3found_logs Tff7b72= Tff7b72True
Tff7b72break T8b949e# Stop at first found log file
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff [ERROR] Could not read logfile: Tffd700{Te6edf3eTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3found_logsTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ff - Logs: No RNS log files found in standard locations.Tffea00\nTa5d6ff"Tb4b4b4)
T8b949e# Check for interfaces and transport status
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
T8b949e# Try to get more info from RNS if it's already running
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Te6edf3resultsTb4b4b4[Ta5d6ff"Ta5d6ffactive_interfacesTa5d6ff"Tb4b4b4] Tff7b72= Tffa657lenTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff - Active Interfaces: Tffd700{Te6edf3resultsTb4b4b4[Ta5d6ff'Ta5d6ffactive_interfacesTa5d6ff'Tb4b4b4]Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3iface Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Te6edf3status Tff7b72= Ta5d6ff"Ta5d6ffActiveTa5d6ff" Tff7b72if Te6edf3ifaceTff7b72.Td2a8ffonline Tff7b72else Ta5d6ff"Ta5d6ffOfflineTa5d6ff"
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff > Tffd700{Te6edf3ifaceTffd700}Ta5d6ff [Tffd700{Te6edf3statusTffd700}Ta5d6ff]Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ff - Active Interfaces: None registered (Reticulum may not be initialized yet)Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
T8b949e# Check for common port conflicts
Te6edf3common_ports Tff7b72= Tb4b4b4[T79c0ff4242Tb4b4b4, T79c0ff8000Tb4b4b4, T79c0ff8080Tb4b4b4] T8b949e# Reticulum default is often 4242
Tff7b72for Te6edf3port Tff7b72in Te6edf3common_portsTb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3conn Tff7b72in Te6edf3psutilTff7b72.Td2a8ffnet_connectionsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3connTff7b72.Td2a8ffladdrTff7b72.Td2a8ffport Tff7b72== Te6edf3port Tff7b72and Te6edf3connTff7b72.Td2a8ffstatus Tff7b72== Ta5d6ff"Ta5d6ffLISTENTa5d6ff"Tb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ff [ALERT] Port Tffd700{Te6edf3portTffd700}Ta5d6ff is already in use by PID Tffd700{Te6edf3connTff7b72.Td2a8ffpidTffd700}Ta5d6ff. Potential conflict.Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72return Te6edf3results
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────